package com.ruoyi.common.utils.uuid;

import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.SequenceUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * ID生成器工具类
 * 
 * @author ruoyi
 */
public class IdUtils
{

    /**
     * 生成流水号工具
     * @param prefix 前缀字母标识
     * @return
     */
    public static String serialNumber(String prefix,RedisCache redisCache,Class clazz){
        synchronized (clazz){
            //日期前缀
            prefix = prefix + SequenceUtil.sdf.format(new Date());
            RedisTemplate redisTemplate = redisCache.redisTemplate;
            //如果日期前缀未过期，则序号自增
            //否则，将日期作为Key，1作为Value重置，并设置第二天0点过期
            if (redisCache.getCacheObject(prefix) != null) {
                redisTemplate.opsForValue().increment(prefix, 1);
            } else {
                redisTemplate.opsForValue().set(prefix, 1);
                redisTemplate.expireAt(prefix, SequenceUtil.getMidnightDate());
            }
            //移位运算符<<,创造yyyyMMdd0001格式
            return (prefix + SequenceUtil.getSequence(String.valueOf(redisTemplate.opsForValue().get(prefix)) , 1 << 2));
        }
    }
    /**
     * 获取随机UUID
     * 
     * @return 随机UUID
     */
    public static String randomUUID()
    {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID()
    {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 随机UUID
     */
    public static String fastUUID()
    {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID()
    {
        return UUID.fastUUID().toString(true);
    }
}
